"""
3. 无重复字符的最长子串
给定一个字符串 s ，请你找出其中不含有重复字符的 最长 子串 的长度。
 
示例 1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 
"""

def length_of_longest_substring_easy(s):
    """
    :type s: str
    :rtype: int
    """
    if not s: return 0
    char_len = len(s)
    if (char_len == 1): return 1

    char_index = 0
    char_map = {}
    while char_index < char_len -1:
        new_str = s[char_index : char_len]
        tmp_str  = []
        for index,char in enumerate(new_str):
            if char in tmp_str:
                char_index = char_index + index
                char_map[''.join(tmp_str)] = index
                break
            else :
                tmp_str.append(char)
        if len(tmp_str) == char_len:
            char_index = char_len
            char_map[''.join(tmp_str)] = char_len 
    max_len = max(char_map.values()) if char_map else 0
    return max_len

def length_of_longest_substring(s):
    """
    :type s: str
    :rtype: int
    """
    char_set = set()  # 记录当前窗口内的字符
    max_len = 0
    left = 0  # 窗口左边界
    
    for right in range(len(s)):
        # 如果当前字符已存在，则移动左指针并移除重复字符
        while s[right] in char_set:
            char_set.remove(s[left])
            left += 1
        # 加入新字符并更新最大长度
        char_set.add(s[right])
        max_len = max(max_len, right - left + 1)
    
    return max_len

if __name__ == '__main__':
    s = "1234123"
    print(length_of_longest_substring(s))
